package com.example.demo.day0227;

import java.util.ArrayList;
import java.util.List;

public class DemoGenericwildcards {
    public void test(List<?> list){//test方法需要一个list集合的参数,在不确定List集合中存放的数据类型时使用通配符<?>
    }

    public void test1(List<? extends Cc> list){//list参数的元素数据类型是Cc及其子类

    }
    public void test2(List<? super Cc> list){//list参数的元素数据类型是Cc及其父类

    }

    public void test3(List<? extends IA> list){//list参数的元素数据类型是接口IA的实现类

    }
}

class Aa{}
class Bb extends Aa{}
class Cc extends Bb{}
class Dd extends Cc{}

class D1{
    public static void main(String[] args) {
        DemoGenericwildcards dgw = new DemoGenericwildcards();
        List<String>l1 = new ArrayList<String>();//在调用含有上面所用的方法时就可以自行定义泛型的数据类型
        dgw.test(l1);

        List<Integer>l2 = new ArrayList<Integer>();
        dgw.test(l2);

        List<Cc>lc = new ArrayList<Cc>();
        dgw.test1(lc);

        List<Dd>ld = new ArrayList<Dd>();
        dgw.test1(ld);

//        List<Bb>lb = new ArrayList<Bb>();
//        dgw.test1(lb);//<? extends Cc>只允许泛型为Cc及Cc子类的引用调用
        dgw.test2(lc);
        List<Aa>la = new ArrayList<Aa>();
        dgw.test2(la);

//        dgw.test2(ld);<? Super Cc>只允许泛型为Cc及Cc父类的引用调用

        List<IAImpl>lia = new ArrayList<IAImpl>();
        dgw.test3(lia);//<? extends IA>只允许泛型为实现IA接口的实现类的引用调用
//        dgw.test3(la);//la并不是接口IA的实现类数据类型
        List<IAImpl1> lia1 = new ArrayList<IAImpl1>();
        dgw.test3(lia1);

    }
}
